[스프링] DAO, DTO, VO, Entity란?

업데이트:



✅ DAO ( Data Access Object )

  • Data Access Object의 약자로, DB 데이터에 접근하기 위한 객체
  • 프로젝트의 Service에 해당하는 부분과 DB를 연결하는 기능 수행
  • CRUD 작업을 수행하는 클래스. 즉, 데이터에 대한 CRUD를 전담하는 오브젝트
  • SpringBoot에서는 Repository 클래스가 DAO의 역할을 수행한다.
public class TestDao {
public void add(TestDto dto) throws ClassNotFoundException, SQLException {
		private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/dao_Db";
    private static final String USER = "root";
    private static final String PASSWORD = "1234";   
		
		String sql = "SELECT * FROM vouchers";

        try {
            con = DriverManager.getConnection(URL, USER, PASSWORD);
            stmt = con.createStatement();
            res = stmt.executeQuery(sql);
            while (res.next()) {
                System.out.println(res.getString("id") + " ");
                System.out.println(res.getString("value") + " ");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

    preparedStatement.setString(1, dto.getName());
    preparedStatement.setInt(2, dto.getValue());
    preparedStatement.setString(3, dto.getData());
    preparedStatement.executeUpdate();
    preparedStatement.close();

    connection.close();

	}
}





✅ DTO ( Data Transfer Object )

  • Data Transfer Object의 약자로, 계층간(MVC) 데이터 전달을 위한 객체
  • 비즈니스 로직을 가지지 않고 getter, setter 메소드만 가진다.
  • 주로 View와 Controller 사이에서 활용된다.
public class personDTO {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setAge(int age) {
		this.age = age;
	}
}





✅ VO ( Value Object )

  • Value Object의 약자로, 값 자체를 표현하는 객체
  • DTO와 유사하지만, setter 메서드를 가지지 않는다.
  • getter 메서드와 이외의 비즈니스 로직을 포함할 수 있다.
  • setter 메서드는 없고, getter 메서드만 존재하기 때문에 오로지 읽기만 가능하다!
  • 객체 간 “필드값”이 같다면 해당 객체들은 같은 객체로 여긴다.
  • 때문에 주소값이 달라도 필드값만 같으면 같은 객체로 여긴다.
  • 참고 자료





✅ Entity

  • 실제 DB와 매핑되는 클래스
  • Entity를 기준으로 테이블을 형성하거나, 형성한 테이블을 기준으로 Entity를 설정해줘야한다.
  • 한마디로 DB 컬럼과 일치하게끔 변수들을 설정해줘야 한다.
  • Entity를 데이터 전달하는 용도로 사용해선 절대 안된다.
  • JPA를 활용한다면 @Entity 어노테이션과 함께 사용하고, 기본 생성자를 필수로 생성해야 한다.
  • 보통 Builder패턴을 활용해서 생성자를 만드는게 일반적이다.


  • 일반적인 Entity 예제
public class Person {
	private final Long id;
	private final String name;
	private final int value;

	public Person(Long id, String name, int value) {
		this.id = id;
		this.name = name;
		this.value = value;
	}
}


  • JPA 활용 Entity 예제

@Entity
@Table(name="Aim")
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Aim {
	 @Id
    @Column(name="instance_id", updatable = false, nullable = false)
    private String instanceId;

    @Column(name="user_id", nullable = false)
    private Integer userId;

    @Column(name="aim_state", nullable = false)
    private Integer aimState;

    @Column(name="server_ip", nullable = true)
    private String serverIp;

    @Column(name="short_url", nullable = true)
    private String shortUrl;

    @Column(name="subscribe_state", nullable = false)
    private Integer subscribeState;

    @Column(name="created_date" , nullable = false)
    private LocalDateTime createdDate;

    @Column(name="expired_date", nullable = false)
    private LocalDateTime expiredDate;

    @Builder
    public Aim(String instanceId, Integer userId, Integer aimState, String serverIp,
               String shortUrl, Integer subscribeState,
               LocalDateTime createdDate, LocalDateTime expiredDate){
        this.instanceId = instanceId;
        this.userId = userId;
        this.aimState = aimState;
        this.serverIp = serverIp;
        this.shortUrl = shortUrl;
        this.subscribeState = subscribeState;
        this.createdDate = createdDate;
        this.expiredDate = expiredDate;
    }
}

댓글남기기